package guis.scene01;

import buslogic.ModelContainer;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import myutils.MessageHelper;

public class Scene01Controller {

    private Scene01ViewModel vm;
    private ModelContainer mc;
    private MessageHelper messages;
    private Scene01ViewModel2ModelMapper mapper;

    @FXML
    private Label label;

    @FXML
    private TextField x1TF;

    @FXML
    private TextField x2TF;

    @FXML
    private TextField d1TF;

    @FXML
    private TextArea errorArea;

    // Diese Methode wird nach dem Inject aufgerufen!
    public void initialize() {

        vm = new Scene01ViewModel();
        mc = new ModelContainer();
        messages = new MessageHelper();
        mapper = new Scene01ViewModel2ModelMapper();

        /**
         * Durch x1TF.textProperty().bind(x1); würde x1 nur nach x1TF
         * synchronisiert, aber nicht umgekehrt. Änderte man dann außerdem x1TF,
         * bekommt außerdem eine RuntimeException: A bound value cannot be set.
         * Man kann für String daher bindBidrectional:
         */
        x1TF.textProperty().bindBidirectional(vm.x1);
        x2TF.textProperty().bindBidirectional(vm.x2);
        errorArea.textProperty().bind(vm.getVm_errorMessages());
        /**
         * Auch bei Double Werten kann man theoretisch bidrectional
         * synchronisieren:
         */
        //d1TF.textProperty().bindBidirectional(vm.d1, NumberFormat.getInstance());
        /**
         * Problem ist aber, dass jetzt bei Fehleingaben für den Double Wert,
         * z.B. 'hi', folgende Exception fliegt: Exception while parsing String
         * in bidirectional binding java.text.ParseException:
         * Format.parseObject(String) failed Was ja korrekt ist, aber dem Anw.
         * muss man das durch eine Meldung geeignet anzeigen.
         */

    }

    @FXML
    private void handleButtonAction(ActionEvent event) {

        messages.clearCompleteMessage();
        mapper.mappeX1(vm, mc, messages);
        mapper.mappeX2(vm, mc, messages);
        mc.validateModel();

        messages.addMessage(mc.getValidationErrors());
        vm.getVm_errorMessages().set(messages.getCompleteMessage());
    }

}
